home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / rpcinfo.nasl < prev    next >
Text File  |  2005-03-31  |  9KB  |  311 lines

  1. # This script was written by Michel Arboi <arboi@alussinan.org>
  2. #
  3. # GPL
  4. #
  5.  
  6. if(description)
  7. {
  8.  script_id(11111);
  9.  script_version ("$Revision: 1.14 $");
  10.  name["english"] = "rpcinfo -p";
  11.  name["francais"] = "rpcinfo -p";
  12.  script_name(english:name["english"], francais:name["francais"]);
  13.  
  14.  desc["english"] = "
  15. This script calls the DUMP RPC on the port mapper, to obtain the
  16. list of all registered programs.
  17.  
  18. Risk factor : None";
  19.  
  20.  
  21.  desc["francais"] = "
  22. Ce script appelle la RPC DUMP sur le portmapper, pour obtenir la 
  23. liste de tous les programmes enregistrΘs.
  24.  
  25. Facteur de risque : Aucun";
  26.  
  27.  
  28.  script_description(english:desc["english"], francais:desc["francais"]);
  29.  
  30.  summary["english"] = "Dumps all the registered RPC";
  31.  summary["francais"] = "Affiche toutes les RPC enregistrΘes";
  32.  script_summary(english:summary["english"], francais:summary["francais"]);
  33.  
  34.  script_category(ACT_GATHER_INFO);
  35.  
  36.  
  37.  script_copyright(english:"This script is Copyright (C) 2002 Michel Arboi",
  38.         francais:"Ce script est Copyright (C) 2002 Michel Arboi");
  39.  family["english"] = "RPC"; 
  40.  family["francais"] = "RPC";
  41.  script_family(english:family["english"], francais:family["francais"]);
  42.  script_dependencie("rpc_portmap.nasl");
  43.  script_require_keys("rpc/portmap");
  44.  exit(0);
  45. }
  46.  
  47. #
  48. include("misc_func.inc");
  49.  
  50. # If the portmapper is not installed, then just exit
  51. portmap = get_kb_item("rpc/portmap");
  52. if(!portmap)exit(0);
  53.  
  54.  
  55. report_tcp = make_list();
  56. report_udp = make_list();
  57.  
  58. soc = open_sock_tcp(portmap);
  59. if (! soc) exit(0);
  60.  
  61. # RPC Names, from Linux /etc/rpc
  62.  
  63. rpc_names="
  64. portmapper    100000    portmap sunrpc rpcbind
  65. rstatd        100001    rstat rup perfmeter rstat_svc
  66. rusersd        100002    rusers
  67. nfs        100003    nfsprog
  68. ypserv        100004    ypprog
  69. mountd        100005    mount showmount
  70. ypbind        100007
  71. walld        100008    rwall shutdown
  72. yppasswdd    100009    yppasswd
  73. etherstatd    100010    etherstat
  74. rquotad        100011    rquotaprog quota rquota
  75. sprayd        100012    spray
  76. 3270_mapper    100013
  77. rje_mapper    100014
  78. selection_svc    100015    selnsvc
  79. database_svc    100016
  80. rexd        100017    rex
  81. alis        100018
  82. sched        100019
  83. llockmgr    100020
  84. nlockmgr    100021
  85. x25.inr        100022
  86. statmon        100023
  87. status        100024
  88. bootparam    100026
  89. ypupdated    100028    ypupdate
  90. keyserv        100029    keyserver
  91. sunlink_mapper    100033
  92. tfsd        100037
  93. nsed        100038
  94. nsemntd        100039
  95. showfhd        100043    showfh
  96. ioadmd        100055    rpc.ioadmd
  97. NETlicense    100062
  98. sunisamd    100065
  99. debug_svc     100066  dbsrv
  100. ypxfrd        100069  rpc.ypxfrd
  101. bugtraqd    100071
  102. kerbd        100078
  103. event        100101    na.event    # SunNet Manager
  104. logger        100102    na.logger    # SunNet Manager
  105. sync        100104    na.sync
  106. hostperf    100107    na.hostperf
  107. activity    100109    na.activity    # SunNet Manager
  108. hostmem        100112    na.hostmem
  109. sample        100113    na.sample
  110. x25        100114    na.x25
  111. ping        100115    na.ping
  112. rpcnfs        100116    na.rpcnfs
  113. hostif        100117    na.hostif
  114. etherif        100118    na.etherif
  115. iproutes    100120    na.iproutes
  116. layers        100121    na.layers
  117. snmp        100122    na.snmp snmp-cmc snmp-synoptics snmp-unisys snmp-utk
  118. traffic        100123    na.traffic
  119. nfs_acl        100227
  120. sadmind        100232
  121. nisd        100300    rpc.nisd
  122. nispasswd    100303    rpc.nispasswdd
  123. ufsd        100233    ufsd
  124. pcnfsd        150001    pcnfs
  125. amd        300019  amq
  126. # Legato NetWorker
  127. nsrd        390103    nsr     # NetWorker service
  128. nsrmmd        390104    nsrmm     # NetWorker media mupltiplexor daemon
  129. nsrindexd    390105    nsrindex # NetWorker file index daemon
  130. nsrmmdbd    390107    nsrmmdb  # NetWorker media management database daemon
  131. nsrjb        390110    nsrjbd     # NetWorker jukebox-control service
  132. nsrexec        390113    nsrexecd # NetWorker client execution service
  133. nsrnotd        390400         # NetWorker notary service
  134. #
  135. sgi_fam        391002    fam
  136. netinfobind    200100001
  137. bwnfsd        545580417
  138. fypxfrd        600100069 freebsd-ypxfrd
  139. ";
  140.  
  141. i=0;
  142.  
  143. # A big thanks to Ethereal!
  144.  
  145. xid1 = rand() % 256;
  146. xid2 = rand() % 256;
  147. xid3 = rand() % 256;
  148. xid4 = rand() % 256;
  149.  
  150. pack = 
  151. raw_string(    0x80, 0, 0, 0x28,    # Last fragment; fragment length = 40
  152.         xid1, xid2, xid3, xid4,    # XID
  153.         0, 0, 0, 0,        # Call
  154.         0, 0, 0, 2,        # RPC version = 2
  155.         0, 1, 0x86, 0xA0,    # Programm = portmapper (10000)
  156.         0, 0, 0, 2,        # Program version = 2
  157.         0, 0, 0, 4,        # Procedure = 4
  158.         0, 0, 0, 0, 0, 0, 0, 0,    # Null credential
  159.         0, 0, 0, 0, 0, 0, 0, 0    # Null verifier
  160.     );
  161.  
  162. send(socket: soc, data: pack);
  163.  
  164. r = recv(socket: soc, length: 4, min: 4);
  165. if(strlen(r) < 4)exit(0);
  166.  
  167. last_frag = r[0];
  168. y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  169. #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  170. # First 4 bytes are XID
  171. r = recv(socket: soc, length: 4, min: 4);
  172.  
  173. # Reply?
  174. r = recv(socket: soc, length: 4, min: 4);
  175. y =ord(r[0])*256; y=y+ord(r[1]); y=y*256; y=y+ord(r[2]); y=y*256;y=y+ord(r[3]);
  176.  
  177. # Accepted?
  178. r = recv(socket: soc, length: 4, min: 4);
  179. a =ord(r[0])*256; a=a+ord(r[1]); a=a*256; a=a+ord(r[2]); a=a*256;a=a+ord(r[3]);
  180.  
  181. # Next 8 bytes are verifier
  182. r = recv(socket: soc, length: 8, min: 8);
  183.  
  184. # Next four is execution status
  185. r = recv(socket: soc, length: 4, min: 4);
  186. z =ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  187.  
  188. #display("Reply=", y, "\nAccepted=", a,"\nExec=", z, "\n");
  189.  
  190. # Reply (1) && accepted (0) && executed successfully (0)
  191. if ((y != 1) || (a != 0) || (z != 0))
  192. {
  193.   close(soc);
  194.   exit(0);
  195. }
  196.  
  197. # Value follow?
  198. r = recv(socket: soc, length: 4, min: 4);
  199. vf =ord(r[0])*256; vf=vf+ord(r[1]); vf=vf*256; vf=vf+ord(r[2]); vf=vf*256;vf=vf+ord(r[3]);
  200. len = 28;
  201. while (vf)
  202. {
  203.   if (len >= frag_len)
  204.   {
  205.     r = recv(socket: soc, length: 4, min: 4);
  206.     last_frag = ord(r[0]);
  207.     y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  208.     #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  209.     len=0;
  210.   }
  211.   r = recv(socket: soc, length: 4, min: 4); len=len+4;
  212.   z =ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  213.   program = z;
  214.  
  215.   if (len >= frag_len)
  216.   {
  217.     r = recv(socket: soc, length: 4, min: 4);
  218.     last_frag = ord(r[0]);
  219.     y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  220.     #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  221.     len=0;
  222.   }
  223.  
  224.   r = recv(socket: soc, length: 4, min: 4); len=len+4;
  225.   z =ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  226.   version = z;
  227.  
  228.   if (len >= frag_len)
  229.   {
  230.     r = recv(socket: soc, length: 4, min: 4);
  231.     last_frag = ord(r[0]);
  232.     y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  233.     #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  234.     len=0;
  235.   }
  236.  
  237.   r = recv(socket: soc, length: 4, min: 4); len=len+4;
  238.   z =ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  239.   proto = z;
  240.  
  241.   if (len >= frag_len)
  242.   {
  243.     r = recv(socket: soc, length: 4, min: 4);
  244.     last_frag = ord(r[0]);
  245.     y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  246.     #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  247.     len=0;
  248.   }
  249.  
  250.   r = recv(socket: soc, length: 4, min: 4); len=len+4;
  251.   z =ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  252.   port = z;
  253.  
  254.   if (len >= frag_len)
  255.   {
  256.     r = recv(socket: soc, length: 4, min: 4);
  257.     last_frag = ord(r[0]);
  258.     y = ord(r[2]) * 256; frag_len = y + ord(r[3]);
  259.     #display("last_frag=", last_frag, " - frag_len=", frag_len, "\n");
  260.     len=0;
  261.   }
  262.  
  263.   r = recv(socket: soc, length: 4, min: 4); len = len+4;
  264.   z = ord(r[0])*256; z=z+ord(r[1]); z=z*256; z=z+ord(r[2]); z=z*256;z=z+ord(r[3]);
  265.   vf = z;
  266.  
  267.   # Running get_port_state is not a great idea: we miss some registered RPC.
  268.   #if ((proto == 17 ) || get_port_state(port))
  269.   {
  270.     req = string("^[a-zA-Z0-9_-]+[ \t]+", program);
  271.     str = egrep(string:rpc_names, pattern: req);
  272.     name = ereg_replace(string: str, 
  273.         pattern: string("^([a-zA-Z0-9_-]+)[ \t]+.*"),
  274.         replace: "\1");
  275.     alias =  ereg_replace(string: str, 
  276.         pattern: string("^[a-zA-Z0-9_-]+[ \t]+[0-9]+[ \t]*(.*)[\r\n]+"),
  277.         replace: "\1");
  278.     #if (! name) name="";
  279.     #if (! alias) alias = "";
  280.  
  281.     #display("program=", program, "\nname=", name, "\nalias=", alias, "version=", version,"\nproto=", proto, "\nport=", port, "\nvalue follow=", vf,"\n\n");
  282.  
  283.     m = string("RPC program #", program, " version ", version);
  284.     if (name) m = string(m, " '", name, "'");
  285.     if (alias) m = string(m, " (", alias, ")");
  286.     m = string(m, " is running on this port");
  287.     if (proto == 6)
  288.     {
  289.       report_tcp[port] += m + '\n';
  290.       #security_note(port: port, data: m);
  291.       # Remember service
  292.       if (name) register_service(port: port, proto: string("RPC/", name));
  293.       else      register_service(port: port, proto: string("RPC/", program));
  294.     }
  295.     if (proto == 17) report_udp[port] += m + '\n'; 
  296.     i=i+1;
  297.   }
  298. }
  299.  
  300. foreach port (keys(report_tcp))
  301.  security_note(port:port, data:report_tcp[port]);
  302. }
  303.  
  304. foreach port (keys(report_udp))
  305.  security_note(port:port, data:report_udp[port], proto:"udp");
  306. }
  307.  
  308.  
  309.